#ifndef GY_CATEGORYTREE_H
#define GY_CATEGORYTREE_H
#include <QTreeWidget>
#include <QtSql/QSqlQuery>

#include "GY_ControlLibrary_global.h"
/**
 * @brief The GY_CategoryTree class 从数据库表构建的分类树Widget
 * 使用前须按如下设计出表结构
 * 表字段按顺序：id(自增), pid(父类id, 顶级分类为0), name(分类名称), attr1(分类属性1, string类型) ... attrN(分类属性N, string类型)
 */
class GY_CONTROLLIBRARY_EXPORT GY_CategoryTree : public QTreeWidget
{
    Q_OBJECT
public:
    enum TreeColumns{name, id};  //固定列，后面的列为各属性列
    GY_CategoryTree(QWidget *parent = nullptr);
    void setDbTableName(const QString &value);  //设置数据库表名
    void setPQuery(QSqlQuery *value);  //设置数据库操作对象
    QVector<QVector<QVariant>> queryData(QString sqlCmd);  //查询数据
    void initTree();  //显示树数据
    void initMenu();  //设置菜单

    //插入数据
    bool insertData(QString sqlCmd);
    //更新数据
    bool updateData(QString sqlCmd);
    //删除数据
    bool deleteData(QString sqlCmd);

    QVector<QTreeWidgetItem * > AllChildrenItem(QTreeWidgetItem * parent);  //树节点所有子节点


protected:
    void dragEnterEvent(QDragEnterEvent *) override;
    void dragMoveEvent(QDragMoveEvent *) override;  //qt5.12
    void dropEvent(QDropEvent *) override;  //当前选中可能改变



private slots:
    void customContextMenu(const QPoint &pos);  //右键菜单
    void add();  //添加分类
    void edt();  //编辑分类
    void del();  //删除分类

private:
    QString dbTableName;  //数据库表名
    QSqlQuery* pQuery = nullptr;  //数据库操作对象
    QStringList columns;  //数据库列
    QTreeWidgetItem * pItemToMove = nullptr;  //要移动的item
    QTreeWidgetItem * pItemParent = nullptr;  //要移动的item的原parent item


    QMenu *pMenu = nullptr;
    QAction *pAdd = nullptr;
    QAction *pDel = nullptr;
    QAction *pEdit = nullptr;

};

#endif // GY_CATEGORYTREE_H
